/*
JS中的数据类型
   原始值类型「基本数据类型 & 值类型」
    + number 整数、小数、零、负数、NaN(不是一个有效数字，但是属于数字类型)、Infinity(无穷大的值)...
    + string 字符串：“”、‘’、``(ES6中的模板字符串，更方便的实现字符串拼接)
    + boolean 布尔：true/false
    + null 空
    + undefined 未定义
    + symbol 唯一值(ES6+)
    + bigint 大数(ES6+)
   对象类型「引用数据类型」
    + 标准普通对象（纯粹的对象）  例如：{x:10,y:20}  原型链(__proto__)直接指向Object.prototype
    + 标准特殊对象
      + new Array 数组
      + new RegExp 正则
      + Math 数学函数对象
      + new Date 日期对象
      + new Error 错误对象
      + Set/Map 「ES6+新增的数据结构 」
      + ...
    + 非标准特殊对象  例如：new Number(1) -> 原始值对应的对象数据类型值
    + 函数对象function
*/

/*
 创建一个值：
   + 字面量方案
   + 构造函数方案「也就是基于“new”创造其一个实例」 
 */
/* let num1 = 10;
let num2 = new Number(10); */

/* let sym1 = Symbol();
// let sym2 = new Symbol(); //Uncaught TypeError: Symbol is not a constructor 不能被new执行
let sym2 = Object(Symbol()); //Object([原始值])：把[原始值]转换为非标准特殊对象（或其所对应的实例对象） */

/* console.log(Symbol() === Symbol());  //false，每一次执行Symbol()都会创建一个唯一值
let sym = Symbol(),
  sym2 = sym;
console.log(sym === sym2); //true */

/* // 在Symbol中设置的描述信息，只能方便我们识别、查看等，但是对其唯一性不会有任何的影响！
let sym1 = Symbol('AA');
let sym2 = Symbol('AA');
console.log(sym1 === sym2);  //false */

/* 
Symbol作用一：就是想创建一个独一无二的值
Symbol作用二：对象可以设置一个Symbol类型的属性（也是为了保证其唯一性）
   每一个对象都是由零到多组“键值对（键->属性名 值->属性值，也被称作为对象的成员）”组成的
      obj['name'] 操作的俗称：成员访问
   对象的“属性值”可以是任何类型，但是“属性名”只能是字符串或者Symbol类型！
Symbol作用三：JS很多底层处理机制，就是基于Symbol提供的方法实现的
   Symbol.iterator/asyncIterator
   Symbol.hasInstanc
   Symbol.toPrimitive
   Symbol.toStringTag
   ...
*/
/* let sym = Symbol('AA');
let obj = {
  name: '珠峰',
  10: 100,
  true: 200,
  [{ x: 10 }]: 300, //我们打算把对象作为属性名，但不允许，默认会把对象转换为字符串'[object Object]'，相当于 obj['[object Object]']=300；ES6中的Map对象，可以允许属性名是除字符串和Symbol以外的类型！
  [Symbol()]: 400,
  [sym]: 500
};
console.log(obj[Symbol()]);  //undefined 此时是获取一个新的唯一值属性的属性值，和之前设置的那个不一样
console.log(obj[sym]);  //500 */

//=====================
/*
BigInt：超大数字
  创建：
  + 字面量
  + 构造函数「也不能被new执行，可以基于Object处理」

  作用：
  流量器具备最大/最小的安全数字「Number.MAX_SAFE_INTEGER，Number.MIN_SAFE_INTEGER」，超过安全数字进行运算，结果是不一定准确的！！
  服务器端存储的数字也是有长度的限制的「和客户端规则不尽相同」，如果服务器返回一个超大数字(一般都是返回字符串，客户端想要进行计算)；按照之前的规则是不准确的，此时需要基于BigInt处理！！
    1.把服务器返回的字符串，变为BigInt格式
    2.让BigInt值和另外一个BigInt值进行运算
    3.把运算的结果发挥给后端「也是变为字符串传递进去」
 */
/* let bin1 = 10n;
let bin2 = Object(10n); */